// 这里可以生成一个简单的额抽象语法树，的函数
function tokenize(text) {
  // 去除多余的空格，逐行解析
  return text
    .trim()
    .split(/\n|\r\n/)
    .reduce((tokens, line, idx) => {
      // 计算缩进空格数
      const spaces = line.match(/^\s+/) || [""]; //匹配开头的空格
      const indent = spaces[0].length; //找出匹配到的空格数
      // 将字符串去首尾空给
      const input = line.trim();
      // 通过空格分割字符串成数组
      const words = input.split(/\s/);
      let value = words.shift();
      // 选择器为单个单词
      if (words.length === 0) {
        tokens.push({
          type: "selector",
          value,
          indent,
        });
      } else {
        //不是单词
        // 这里对变量定义和变量引用做一下区分，方便后面语法分析
        let type = "";
        if (/^\$/.test(value)) {
          //单词首字符为 $
          type = "variableDef";
        } else if (/^[a-zA-Z-]+$/.test(value)) {
          type = "property";
        } else {
          throw new Error(
            `Tokenize error:Line ${idx} "${value}" is not a vairable or property!`
          );
        }
        tokens.push({
          type,
          value,
          indent,
        });
        // 为了后面解析方便这里对变量引用和值进行区分
        while ((value = words.shift())) {
          tokens.push({
            type: /^\$/.test(value) ? "variableRef" : "value",
            value,
            indent: 0,
          });
        }
      }
      return tokens;
    }, []);
}

module.exports = {
  tokenize
}